luci-base: form.js: consider aliased options in AbstractValue.remove()
authorJo-Philipp Wich <[email protected]>
Tue, 1 Jun 2021 12:45:42 +0000 (14:45 +0200)
committerJo-Philipp Wich <[email protected]>
Sat, 12 Jun 2021 17:23:10 +0000 (19:23 +0200)
If different options point to the same underlying uci option, we must only
remove the uci value if none of the other alias options is active in order
to prevent inactive options (due to unsatisfied depends) removing the uci
value of active once on save.

Signed-off-by: Jo-Philipp Wich <[email protected]>
(cherry picked from commit f3f74bd0fe66b94a99a8d944b63dcd6bdd1b93c6)

modules/luci-base/htdocs/luci-static/resources/form.js

index e51e142e0202f3ccd96edb58cba11d4728d22f45..52506d30e8a92ba600332e48c7f93dd3da0210eb 100644 (file)
@@ -2035,10 +2035,32 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
         * The configuration section ID
         */
        remove: function(section_id) {
-               return this.map.data.unset(
-                       this.uciconfig || this.section.uciconfig || this.map.config,
-                       this.ucisection || section_id,
-                       this.ucioption || this.option);
+               var this_cfg = this.uciconfig || this.section.uciconfig || this.map.config,
+                   this_sid = this.ucisection || section_id,
+                   this_opt = this.ucioption || this.option;
+
+               for (var i = 0; i < this.section.children.length; i++) {
+                       var sibling = this.section.children[i];
+
+                       if (sibling === this || sibling.ucioption == null)
+                               continue;
+
+                       var sibling_cfg = sibling.uciconfig || sibling.section.uciconfig || sibling.map.config,
+                           sibling_sid = sibling.ucisection || section_id,
+                           sibling_opt = sibling.ucioption || sibling.option;
+
+                       if (this_cfg != sibling_cfg || this_sid != sibling_sid || this_opt != sibling_opt)
+                               continue;
+
+                       if (!sibling.isActive(section_id))
+                               continue;
+
+                       /* found another active option aliasing the same uci option name,
+                        * so we can't remove the value */
+                       return;
+               }
+
+               this.map.data.unset(this_cfg, this_sid, this_opt);
        }
 });